// 应用错误处理

/**
 * 错误类型枚举
 */
export enum ErrorType {
  /** 参数错误 */
  VALIDATION_ERROR = 'VALIDATION_ERROR',
  /** 资源未找到 */
  NOT_FOUND = 'NOT_FOUND',
  /** 授权错误 */
  UNAUTHORIZED = 'UNAUTHORIZED',
  /** 业务逻辑错误 */
  BUSINESS_ERROR = 'BUSINESS_ERROR',
  /** 系统错误 */
  SYSTEM_ERROR = 'SYSTEM_ERROR',
  /** 网络错误 */
  NETWORK_ERROR = 'NETWORK_ERROR'
}

/**
 * 应用错误类
 * 用于统一处理应用中的错误
 */
export class AppError extends Error {
  /** 错误类型 */
  type: ErrorType;
  /** 错误代码 */
  code: string;
  /** 错误详情 */
  details?: any;
  /** 原始错误 */
  originalError?: Error;

  /**
   * 构造函数
   * @param message 错误消息
   * @param type 错误类型
   * @param code 错误代码
   * @param details 错误详情
   * @param originalError 原始错误
   */
  constructor(
    message: string,
    type: ErrorType = ErrorType.SYSTEM_ERROR,
    code: string = 'UNKNOWN_ERROR',
    details?: any,
    originalError?: Error
  ) {
    super(message);
    this.name = 'AppError';
    this.type = type;
    this.code = code;
    this.details = details;
    this.originalError = originalError;
    
    // 设置堆栈跟踪
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, this.constructor);
    }
  }

  /**
   * 创建验证错误
   * @param message 错误消息
   * @param code 错误代码
   * @param details 验证失败的字段详情
   * @returns 验证错误实例
   */
  static validationError(message: string, code: string = 'VALIDATION_FAILED', details?: any): AppError {
    return new AppError(message, ErrorType.VALIDATION_ERROR, code, details);
  }

  /**
   * 创建资源未找到错误
   * @param message 错误消息
   * @param code 错误代码
   * @param details 资源详情
   * @returns 未找到错误实例
   */
  static notFoundError(message: string, code: string = 'RESOURCE_NOT_FOUND', details?: any): AppError {
    return new AppError(message, ErrorType.NOT_FOUND, code, details);
  }

  /**
   * 创建授权错误
   * @param message 错误消息
   * @param code 错误代码
   * @returns 授权错误实例
   */
  static unauthorizedError(message: string = '未授权访问', code: string = 'UNAUTHORIZED'): AppError {
    return new AppError(message, ErrorType.UNAUTHORIZED, code);
  }

  /**
   * 创建业务逻辑错误
   * @param message 错误消息
   * @param code 错误代码
   * @param details 业务详情
   * @returns 业务错误实例
   */
  static businessError(message: string, code: string = 'BUSINESS_RULE_VIOLATED', details?: any): AppError {
    return new AppError(message, ErrorType.BUSINESS_ERROR, code, details);
  }

  /**
   * 创建系统错误
   * @param message 错误消息
   * @param code 错误代码
   * @param originalError 原始错误
   * @returns 系统错误实例
   */
  static systemError(message: string = '系统错误', code: string = 'SYSTEM_ERROR', originalError?: Error): AppError {
    return new AppError(message, ErrorType.SYSTEM_ERROR, code, undefined, originalError);
  }

  /**
   * 创建网络错误
   * @param message 错误消息
   * @param code 错误代码
   * @param originalError 原始错误
   * @returns 网络错误实例
   */
  static networkError(message: string = '网络连接失败', code: string = 'NETWORK_ERROR', originalError?: Error): AppError {
    return new AppError(message, ErrorType.NETWORK_ERROR, code, undefined, originalError);
  }

  /**
   * 将错误转换为对象表示
   * 用于日志记录和错误报告
   * @returns 错误对象表示
   */
  toObject(): {
    name: string;
    message: string;
    type: ErrorType;
    code: string;
    details?: any;
    stack?: string;
  } {
    return {
      name: this.name,
      message: this.message,
      type: this.type,
      code: this.code,
      details: this.details,
      stack: this.stack
    };
  }

  /**
   * 检查是否为特定类型的错误
   * @param type 错误类型
   * @returns 是否为该类型错误
   */
  isType(type: ErrorType): boolean {
    return this.type === type;
  }
}